home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / scope / 101-125 / scopedisk122 / bassub / qsort.sub < prev    next >
Text File  |  1995-03-19  |  3KB  |  140 lines

  1. REM Sorting routines using quicksort
  2. 'QSnums for numbers
  3. 'QSstr for strings
  4. 'QSints for integers
  5. 'Table#(),Table$(),Table%(0) are arrays of elements to be sorted
  6. 'Number of Entries% is number of elements in Table()
  7. REM QSnums
  8. SUB QSnums (Table#(1),NumberofEntries%) STATIC
  9.   DIM Switched%(20+NumberofEntries%/4)
  10.   Switched%(1)=1
  11.   Switched%(2)=NumberofEntries%
  12.   Pointer%=2
  13. QSnums1:
  14.   Last%=Switched%(Pointer%)
  15.   Pointer%=Pointer%-1
  16.   first%=Switched%(Pointer%)
  17.   Pointer%=Pointer%-1
  18.   LeadIndex%=first%
  19. QSnums2:
  20.   TrailIndex%=Last%
  21.   MidPoint#=Table#((first%+Last%)/2)
  22. QSnums3:
  23.   IF Table#(LeadIndex%)<MidPoint# THEN
  24.     LeadIndex%=LeadIndex%+1
  25.     GOTO QSnums3
  26.   END IF
  27. QSnums4:
  28.   IF Table#(TrailIndex%)>MidPoint# THEN
  29.     TrailIndex%=TrailIndex%-1
  30.     GOTO QSnums4
  31.   END IF
  32.   IF LeadIndex%<=TrailIndex% THEN
  33.     Temp#=Table#(LeadIndex%)
  34.     Table#(LeadIndex%)=Table#(TrailIndex%)
  35.     Table#(TrailIndex%)=Temp#
  36.     LeadIndex%=LeadIndex%+1
  37.     TrailIndex%=TrailIndex%-1
  38.   END IF
  39.   IF LeadIndex%<=TrailIndex% THEN QSnums3
  40.   IF first%<TrailIndex% THEN
  41.     Pointer%=Pointer%+1
  42.     Switched%(Pointer%)=first%
  43.     Pointer%=Pointer%+1
  44.     Switched%(Pointer%)=TrailIndex%
  45.   END IF
  46.   first%=LeadIndex%
  47.   IF first%<Last% THEN QSnums2
  48.   IF Pointer%<>0 THEN QSnums1
  49.   ERASE Switched%
  50. END SUB
  51. REM QSstr
  52. SUB QSstr (Table$(1),NumberofEntries%) STATIC:
  53.   DIM Switched%(20+NumberofEntries%/4)
  54.   Switched%(1)=1
  55.   Switched%(2)=NumberofEntries%
  56.   Pointer%=2
  57. QSstr1:
  58.   Last%=Switched%(Pointer%)
  59.   Pointer%=Pointer%-1
  60.   first%=Switched%(Pointer%)
  61.   Pointer%=Pointer%-1
  62.   LeadIndex%=first%
  63. QSstr2:
  64.   TrailIndex%=Last%
  65.   MidPoint$=Table$((first%+Last%)/2)
  66. QSstr3:
  67.   IF UCASE$(Table$(LeadIndex%))<UCASE$(MidPoint$) THEN
  68.     LeadIndex%=LeadIndex%+1
  69.     GOTO QSstr3
  70.   END IF
  71. QSstr4:
  72.   IF UCASE$(Table$(TrailIndex%))>UCASE$(MidPoint$) THEN
  73.     TrailIndex%=TrailIndex%-1
  74.     GOTO QSstr4
  75.   END IF
  76.   IF LeadIndex%<=TrailIndex% THEN
  77.     Temp$=Table$(LeadIndex%)
  78.     Table$(LeadIndex%)=Table$(TrailIndex%)
  79.     Table$(TrailIndex%)=Temp$
  80.     LeadIndex%=LeadIndex%+1
  81.     TrailIndex%=TrailIndex%-1
  82.   END IF
  83.   IF LeadIndex%<=TrailIndex% THEN QSstr3
  84.   IF first%<TrailIndex% THEN
  85.     Pointer%=Pointer%+1
  86.     Switched%(Pointer%)=first%
  87.     Pointer%=Pointer%+1
  88.     Switched%(Pointer%)=TrailIndex%
  89.   END IF
  90.   first%=LeadIndex%
  91.   IF first%<Last% THEN QSstr2
  92.   IF Pointer%<>0 THEN QSstr1
  93.   ERASE Switched%
  94. END SUB
  95. REM QSints
  96. SUB QSints (Table%(1),NumberofEntries%) STATIC
  97.   DIM Switched%(20+NumberofEntries%/4)
  98.   Switched%(1)=1
  99.   Switched%(2)=NumberofEntries%
  100.   Pointer%=2
  101. QSints1:
  102.   Last%=Switched%(Pointer%)
  103.   Pointer%=Pointer%-1
  104.   first%=Switched%(Pointer%)
  105.   Pointer%=Pointer%-1
  106.   LeadIndex%=first%
  107. QSints2:
  108.   TrailIndex%=Last%
  109.   MidPoint%=Table%((first%+Last%)/2)
  110. QSints3:
  111.   IF Table%(LeadIndex%)<MidPoint% THEN
  112.     LeadIndex%=LeadIndex%+1
  113.     GOTO QSints3
  114.   END IF
  115. QSints4:
  116.   IF Table%(TrailIndex%)>MidPoint% THEN
  117.     TrailIndex%=TrailIndex%-1
  118.     GOTO QSints4
  119.   END IF
  120.   IF LeadIndex%<=TrailIndex% THEN
  121.     Temp%=Table%(LeadIndex%)
  122.     Table%(LeadIndex%)=Table%(TrailIndex%)
  123.     Table%(TrailIndex%)=Temp%
  124.     LeadIndex%=LeadIndex%+1
  125.     TrailIndex%=TrailIndex%-1
  126.   END IF
  127.   IF LeadIndex%<=TrailIndex% THEN QSints3
  128.   IF first%<TrailIndex% THEN
  129.     Pointer%=Pointer%+1
  130.     Switched%(Pointer%)=first%
  131.     Pointer%=Pointer%+1
  132.     Switched%(Pointer%)=TrailIndex%
  133.   END IF
  134.   first%=LeadIndex%
  135.   IF first%<Last% THEN QSints2
  136.   IF Pointer%<>0 THEN QSints1
  137.   ERASE Switched%
  138. END SUB
  139.  
  140.